package com.rui.shangXueTang.tree;

/**
 * @author : [锐神NO.3]
 * @version : [v1.0]
 * @className : Node
 * @createTime : [2022/2/16 21:42]
 * @description : [树的节点]
 */

public class Node {

    private int no;

    private String name;

    private Node left;

    private Node right;

    /**
     * 初始化节点
     * @param no 节点编号
     * @param name 节点名称
     */
    public Node(int no , String name){
        this.no = no;
        this.name = name;
    }

    public Node() {
    }

    @Override
    public String toString() {
        return "Node{" +
                "no=" + no +
                ", name='" + name + '\'' +
                '}';
    }

    public int getNo() {
        return no;
    }

    public void setNo(int no) {
        this.no = no;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Node getLeft() {
        return left;
    }

    public void setLeft(Node left) {
        this.left = left;
    }

    public Node getRight() {
        return right;
    }

    public void setRight(Node right) {
        this.right = right;
    }

    /**
     * 定义前序遍历
     */
    public void preSelect(){
        //先输出根节点
        System.out.println(this);

        //输出左节点
        if(this.left != null){
            this.left.preSelect();
        }

        //输出右节点
        if(this.right != null){
            this.right.preSelect();
        }
    }

    /**
     * 中序遍历
     */
    public void midSelect(){
        //先输出左节点
        if(this.left != null){
            this.left.midSelect();
        }
        //输出根节点
        System.out.println(this);

        //输出右节点
        if(this.right != null){
            this.right.midSelect();
        }
    }

    /**
     * 后序遍历
     */
    public void backSelect(){
        //先输出左节点
        if(this.left != null){
            this.left.backSelect();
        }

        //输出右节点
        if(this.right != null){
            this.right.backSelect();
        }

        //输出根节点
        System.out.println(this);
    }

    /**
     * 前序遍历查找
     */
    public Node preSearch(int no){
        //判断是否是当前节点
        if(this.no == no){
            return this;
        }

        //查询左子节点
        Node lNode = null;
        if(this.left != null){
            lNode = this.left.preSearch(no);
        }

        if(lNode != null){
            return lNode;
        }

        //查询当前节点右子节点，如果不为空，则继续递归前序查找
        if(this.right != null){
            lNode = this.right.preSearch(no);
        }

        return lNode;
    }

    /**
     * 中序遍历查找
     */
    public Node midSearch(int no) {
        Node node = null;

        if(this.left != null){
            node = this.left.midSearch(no);
        }

        if(node != null){
            return node;
        }

        //对比当前节点
        if(this.no == no){
            return this;
        }

        //遍历右子节点
        if(this.right != null){
            node = this.right.midSearch(no);
        }

        return node;
    }

    /**
     * 后续遍历查找
     */
    public Node backSearch(int no){
        Node node = null;

        if(this.left != null){
            node = this.left.backSearch(no);
        }

        if(node != null){
            return node;
        }

        if(this.right != null){
            node = this.right.backSearch(no);
        }

        if(node != null){
            return node;
        }

        if(this.no == no){
            return this;
        }

        return node;
    }

    /**
     * 删除节点
     * 1.删除的是叶子节点
     * 2.删除的是子树
     */
    public void delNode(int no){
        //1.当前节点的左节点不为空，并且左子节点就是要删除额节点
        if(this.left != null && this.left.no == no){
            this.left = null;
        }

        //2.当前节点的右节点不为空，并且右子节点就是要删除的节点
        if(this.right != null && this.right.no == no){
            this.right = null;
        }

        //3.如果第一步和第二步没有执行，那么需要向左子树进行递归删除
        if(this.left != null){
            this.left.delNode(no);
        }

        //4.如果第三步没有执行，那么需要向右子树进行递归删除
        if(this.right != null){
            this.right.delNode(no);
        }
    }
}
